﻿using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;

namespace SmartPlant.Updater
{
    /// <summary>
    /// 用于在Json格式文件的会话之间存储AutoUpdater状态。
    /// </summary>
    public class JsonFilePersistenceProvider : IPersistenceProvider
    {
        /// <summary>
        /// Json格式文件的路径。
        /// </summary>
        private string FileName { get; set; }

        /// <summary>
        /// 
        /// </summary>
        private PersistedValues PersistedValues { get; set; }

        /// <summary>
        /// 初始化<see cref="JsonFilePersistenceProvider"/>类的新实例。
        /// </summary>
        /// <remarks>使用FileName属性指定Json格式文件的路径。</remarks>
        public JsonFilePersistenceProvider(string jsonPath)
        {
            FileName = jsonPath;
            ReadFile();
        }

        /// <summary>
        /// 将应用修改的内容存储到FileName属性中指定的Json格式的文件中。
        /// </summary>
        private void Save()
        {
            string json;

            using (var stream = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(PersistedValues.GetType());
                serializer.WriteObject(stream, PersistedValues);

                using var reader = new StreamReader(stream);
                stream.Seek(0, SeekOrigin.Begin);
                json = reader.ReadToEnd();
            }

            File.WriteAllText(FileName, json);
        }

        /// <summary>
        /// 读取Json格式的文件，并返回类PersistedValues的初始化实例。
        /// </summary>
        /// <remarks>该函数创建一个新实例，使用默认参数初始化，以防文件不存在。</remarks>
        private void ReadFile()
        {
            PersistedValues jsonFile = null;

            if (File.Exists(FileName))
            {
                using var stream = new MemoryStream(Encoding.UTF8.GetBytes(File.ReadAllText(FileName)));
                var serializer = new DataContractJsonSerializer(typeof(PersistedValues));
                jsonFile = (PersistedValues)serializer.ReadObject(stream);
            }

            PersistedValues = jsonFile ?? new PersistedValues();
        }

        /// <inheritdoc />
        public Version GetSkippedVersion()
        {
            return PersistedValues.SkippedVersion;
        }

        /// <inheritdoc />
        public DateTime? GetRemindLater()
        {
            return PersistedValues.RemindLaterAt;
        }

        /// <inheritdoc />
        public void SetSkippedVersion(Version version)
        {
            PersistedValues.SkippedVersion = version;
            Save();
        }

        /// <inheritdoc />
        public void SetRemindLater(DateTime? remindLaterAt)
        {
            PersistedValues.RemindLaterAt = remindLaterAt;
            Save();
        }
    }

    /// <summary>
    /// 提供序列化和反序列化AutoUpdater持久化值的方法。 
    /// </summary>
    [DataContract]
    public class PersistedValues
    {
        /// <summary>
        /// 要跳过的应用程序版本。
        /// </summary>
        /// <remarks>SetSkippedVersion函数设置此属性并调用 Save（）方法以使更改永久化。</remarks>
        [DataMember]
        public Version SkippedVersion { get; set; }

        /// <summary>
        /// 必须再次向用户提供升级应用程序的可能性的日期和时间。
        /// </summary>
        [DataMember]
        public DateTime? RemindLaterAt { get; set; }
    }
}